/*
 * 本开源项目使用木兰公共许可证，第2版（MulanPubL-2.0）
 * 开发团队：战辰云团队
 * 开源地址：https://gitee.com/zcycloudpy/tt-process-blocker
 *
 * 您可以自由复制、使用、修改和分发本软件，但必须遵守许可证条款。
 * 如需获取完整许可证文本，请访问：http://license.coscl.org.cn/MulanPubL-2.0
 */

package main

import (
	"fmt"
	"strings"
	"time"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/app"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/theme"
	"fyne.io/fyne/v2/widget"

	"github.com/shirou/gopsutil/v3/process"
)

func main() {
	a := app.New()
	a.Settings().SetTheme(theme.LightTheme())
	w := a.NewWindow("冷辰TT进程管理器")

	// 固定窗口大小
	w.Resize(fyne.NewSize(800, 600))
	w.SetFixedSize(true)
	w.CenterOnScreen()

	// 表格
	table := widget.NewTable(
		func() (int, int) { return 0, 4 },
		func() fyne.CanvasObject {
			l := widget.NewLabel("")
			l.Alignment = fyne.TextAlignLeading
			return l
		},
		func(id widget.TableCellID, co fyne.CanvasObject) {
			co.(*widget.Label).SetText("")
		},
	)
	table.SetColumnWidth(0, 80)   // PID
	table.SetColumnWidth(1, 280)  // 进程名
	table.SetColumnWidth(2, 120)  // CPU
	table.SetColumnWidth(3, 120)  // 内存

	// 表头（加粗样式）
	header := container.NewGridWithColumns(4,
		container.NewCenter(widget.NewLabelWithStyle("PID", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})),
		container.NewCenter(widget.NewLabelWithStyle("进程名", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})),
		container.NewCenter(widget.NewLabelWithStyle("CPU", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})),
		container.NewCenter(widget.NewLabelWithStyle("内存", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})),
	)

	// 状态栏
	statusLabel := widget.NewLabel("就绪")

	// 一键结束按钮
	endAllBtn := widget.NewButton("一键结束全部TT进程", func() {
		go func() {
			count := 0
			procs, _ := process.Processes()
			for _, p := range procs {
				name, _ := p.Name()
				if name != "" && strings.Contains(strings.ToLower(name), "tt") {
					if err := p.Kill(); err == nil {
						count++
					}
				}
			}
			fyne.Do(func() {
				statusLabel.SetText(fmt.Sprintf("已结束 %d 个TT进程", count))
			})
			refreshTable(table)
		}()
	})

	// 标题
	title := widget.NewLabelWithStyle("冷辰TT进程管理器", fyne.TextAlignCenter, fyne.TextStyle{Bold: true})

	// 顶部区域（标题 + 按钮）
	top := container.NewVBox(
		title,
		container.NewCenter(endAllBtn),
		header,
	)

	// 主布局：顶部内容 + 占满空间的表格 + 底部状态栏
	content := container.NewBorder(
		top,         // 顶部
		statusLabel, // 底部
		nil, nil,    // 左右
		container.NewMax(table), // 中间占满
	)

	w.SetContent(content)

	// 初始刷新
	go refreshTable(table)

	// 自动刷新
	go func() {
		for {
			refreshTable(table)
			time.Sleep(time.Second)
		}
	}()

	w.ShowAndRun()
}

func refreshTable(table *widget.Table) {
	procs, err := process.Processes()
	if err != nil {
		return
	}

	var data []string
	for _, p := range procs {
		name, _ := p.Name()
		if name == "" || !strings.Contains(strings.ToLower(name), "tt") {
			continue
		}

		cpu, _ := p.CPUPercent()
		memInfo, _ := p.MemoryInfo()
		memMB := float64(memInfo.RSS) / 1024 / 1024

		data = append(data, fmt.Sprintf("%d|%s|%.2f%%|%.2f MB", p.Pid, name, cpu, memMB))
	}

	fyne.Do(func() {
		tableLength := len(data)
		table.Length = func() (int, int) { return tableLength, 4 }
		table.UpdateCell = func(id widget.TableCellID, co fyne.CanvasObject) {
			if id.Row >= tableLength {
				co.(*widget.Label).SetText("")
				return
			}
			parts := strings.Split(data[id.Row], "|")
			co.(*widget.Label).SetText(parts[id.Col])
		}
		table.Refresh()
	})
}